/**
 * 路由拦截器
 * @description 统一处理路由变更时的VIP状态更新
 */

import store from '@/store'
import { getToken } from '@/utils/auth'

// 上次更新VIP状态的时间戳
let lastUpdateTime = 0
// VIP状态更新间隔（毫秒），避免频繁请求
const UPDATE_INTERVAL = 2000

/**
 * 更新VIP状态
 * @returns {Promise}
 */
async function updateVipStatus() {
  try {
    // 如果没有token，不更新
    const token = getToken()
    if (!token) {
      return Promise.resolve()
    }

    // 防止频繁请求
    const now = Date.now()
    if (now - lastUpdateTime < UPDATE_INTERVAL) {
      return Promise.resolve()
    }
    lastUpdateTime = now

    // 调用store的action更新VIP状态
    await store.dispatch('user/updateVipStatus')
  } catch (error) {
    console.error('更新VIP状态失败:', error)
    // 失败时不抛出错误，避免影响路由跳转
  }
}

/**
 * 判断是否为tabBar页面
 * @param {String} path - 页面路径
 * @returns {Boolean}
 */
function isTabBarPage(path) {
  if (!path || typeof path !== 'string') {
    return false
  }
  
  const tabBarPages = [
    'pages/index/index',
    'pages/tactics/tactics',
    'pages/progress/progress',
    'pages/data/index',
    'pages/my/my'
  ]
  
  const cleanPath = path.replace(/^\/+/, '').split('?')[0].trim()
  return tabBarPages.includes(cleanPath)
}

/**
 * 路由拦截器 - 在路由变更时更新VIP状态
 * @param {Object} options - 路由选项
 */
export function routeInterceptor(options) {
  const { url } = options
  
  if (!url) {
    return
  }

  // 判断是否为tabBar页面
  if (isTabBarPage(url)) {
    // tabBar页面切换时更新VIP状态
    updateVipStatus()
  }
}

/**
 * 初始化路由拦截器
 * 重写uni的路由方法，在路由变更时自动更新VIP状态
 */
export function initRouteInterceptor() {
  // 保存原始方法
  const originalNavigateTo = uni.navigateTo
  const originalSwitchTab = uni.switchTab
  const originalRedirectTo = uni.redirectTo
  const originalReLaunch = uni.reLaunch

  // 重写 navigateTo
  uni.navigateTo = function(options) {
    routeInterceptor(options)
    return originalNavigateTo.call(this, options)
  }

  // 重写 switchTab（tabBar页面切换）
  uni.switchTab = function(options) {
    routeInterceptor(options)
    return originalSwitchTab.call(this, options)
  }

  // 重写 redirectTo
  uni.redirectTo = function(options) {
    routeInterceptor(options)
    return originalRedirectTo.call(this, options)
  }

  // 重写 reLaunch
  uni.reLaunch = function(options) {
    routeInterceptor(options)
    return originalReLaunch.call(this, options)
  }
}

export default {
  updateVipStatus,
  routeInterceptor,
  initRouteInterceptor
}

